#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File   : a_function_asterisk.py
# @Email  : xuexia_xu@feidee.com
# @Time   : 2024/3/20 9:56
# @Desc   : *-命名关键字参数 和 ** -关键字参数
"""
*args是可变参数，args接收的是一个tuple
**kw是关键字参数，kw接收的是一个dict
"""


def person_args(name, age, *args, city):
    """
    *使用
    :param city:
    :param name:
    :param age:
    :param args:
    :return:
    """
    print(name, age, args, city)


def person_kw(name, age, **kw):
    """
    **使用
    :param name:
    :param age:
    :param kw:
    :return:
    """
    print('name:', name, 'age:', age, 'other:', kw)


def f1(a, b, c=0, *args, **kw):
    """
     * 和 **混合使用
    :param a:
    :param b:
    :param c:
    :param args:
    :param kw:
    :return:
    """
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)


def mul(x, *y):
    """
    接收多个参数进行乘积
    :param x:
    :param y:
    :return:
    """
    for i in y:
        x = x * i
    return x


if __name__ == '__main__':
    # 关键字参数既可以直接传入：func(a=1, b=2)，又可以先组装dict，再通过**kw传入：func(**{'a': 1, 'b': 2})
    person_kw('Adam', 45, gender='M', job='Engineer')

    extra = {'city': 'Beijing', 'job': 'Engineer'}
    person_kw('Jack', 24, **extra)

    # *args在中间，所以city传参需要带上参数名
    person_args('Amy', 20, 'happy', 'testing engineer', city='Shenzhen')

    f1(1, 2, 3, 'a', 'b', x=99)

    print("total:", mul(1, 2, 3, 4, 10))
